#!/usr/bin/perl
use strict;

use lib qw( ../lib );

use lib qw( lib );

use Gantry::Samples qw{
    -Engine=CGI
    -TemplateEngine=TT
    Static
    -PluginNamespace=Gantry::Samples
    AuthCookie Static
};

use Getopt::Long;
use Gantry::Server;
use Gantry::Engine::CGI;

use Gantry::Conf;

my $dbd;
my $dbuser;
my $dbpass;
my $dbname;

my $conf_instance = 'samples';
my $conf_type;
my $conf_file     = 'docs/app.gantry.conf';

GetOptions(
    'dbd|d=s'      => \$dbd,
    'dbuser|u=s'   => \$dbuser,
    'dbpass|p=s'   => \$dbpass,
    'dbname|n=s'   => \$dbname,
    'instance|i=s' => \$conf_instance,
    'type|t=s'     => \$conf_type,
    'file|f=s'     => \$conf_file,
    'help|h'       => \&usage,
);

if ( $conf_type and $conf_type ne 'base' ) {
    $conf_instance = "samples_$conf_type";
}

my $config = Gantry::Conf->retrieve(
    {
        instance    => $conf_instance,
        config_file => $conf_file,
    }
);

if ( $dbd or $dbname ) {
    $dbd ||= 'SQLite';
    $config->{ dbconn } = "dbi:$dbd:dbname=$dbname";
}

$config->{ dbuser } = $dbuser if $dbuser;
$config->{ dbpass } = $dbpass if $dbpass;

my $cgi = Gantry::Engine::CGI->new( {
    config => $config,
    locations => {
        '/' => 'Gantry::Samples',
        '/fileupload' => 'Gantry::Samples::FileUpload',
        '/ajaxrequest' => 'Gantry::Samples::AjaxRequest',
        '/authcookie' => 'Gantry::Samples::AuthCookie',
        '/authcookie/sqlite/closed' => 'Gantry::Samples::AuthCookie::SQLite::Closed',
        '/authcookie/sqlite' => 'Gantry::Samples::AuthCookie::SQLite',
        '/user' => 'Gantry::Samples::User',
        '/user/group' => 'Gantry::Samples::User::Group',
        '/table_perms' => 'Gantry::Samples::TablePermissions',
        '/table_perms_crud' => 'Gantry::Samples::TablePermCRUD',
        '/GantrySoapService' => 'Gantry::Samples::SOAP',
    },
} );

my $port = shift || 8080;

my $server = Gantry::Server->new( $port );
$server->set_engine_object( $cgi );

print STDERR "Available urls:\n";
foreach my $url ( sort keys %{ $cgi->{ locations } } ) {
    print STDERR "  http://localhost:${port}$url\n";
}
print STDERR "\n";

$server->run();

sub usage {
    print << 'EO_HELP';
usage: app.server [options] [port]
    port defaults to 8080

    options:
    -h  --help     prints this message and quits
    -i  --instance name of a Gantry::Conf instance
                   defaults to samples
    -t  --type     type of one Bigtop config block
                   defaults to the unnamed block
    -f  --file     master Gantry::Conf file
                   defaults to docs/app.gantry.conf

    options which override Gantry::Conf values:
    -d  --dbd      DBD module name (e.g. Pg, mysql, etc)
    -n  --dbname   name of database
    -u  --dbuser   database user name
    -p  --dbpass   dbuser's database password

Note that -i and -t are incompatible.  The former fully specifies an
instance name for Gantry::Conf.  The later specifies the config type
suffix of an instance name.  If you use both, -t takes precedence.

-d defaults to SQLite.

EO_HELP

    exit 0;
}

=head1 NAME

app.server - A generated server for the Gantry::Samples app

=head1 SYNOPSIS

    usage: app.server [options] [port]

port defaults to 8080

=head1 DESCRIPTION

This is a Gantry::Server based stand alone server for the Gantry::Samples
app.  It was built to use the samples Gantry::Conf instance in the
docs directory.

To override the database connection information in your conf file,
see L<Changing Databases without Changing Conf> below.

To change instances or master conf files, use these
flags (they all require values):

=over 4

=item --instance (or -i)

(Incompatible with --type)

The full name of your conf instance, defaults to samples.

=item --type (or -t)

(Incompatible with --instance)

Use this if you use named config blocks in your Bigtop file.  Use the
name of the config block as the value for --type.  This will build the
corresponding instance name as samples_TYPE, where TYPE is the value
of this flag.

If you don't neither --instance nor --type, the instance you get will
be samples.

=item --file (or -f)

The name of your master Gantry::Conf file, defaults to docs/app.gantry.conf.

=back

=head1 Changing Databases without Changing Conf

You may use the following flags to control database connections.  If you
supply these flags, they will take precedence over your Gantry::Conf instance.
All of them require values.

=over 4

=item --dbd (or -d)

The name of your DBD module (like SQLite, Pg, or mysql).  If you use
dbname, this defaults to SQLite.

=item --dbname (or -n)

The name of your database.

=item --dbuser (or -u)

Your database user name.

=item --dbpass (or -p)

Your database password.

=back

=cut
